import { nearest_param, nearest_datacontainer } from "./nearest.mjs";

/**
 * 数据访问和修改工具函数
 * @param {HTMLElement|Object} container - DOM元素或数据对象
 * @param {string} datapath - 数据访问路径
 * @param {any} value - 可选，要设置的值。如果提供则为写入模式，否则为读取模式
 * @returns {any} 根据路径获取或设置的数据值
 */
export default function (container, datapath, value) {
  if (!datapath) return;

  // 处理参数访问模式（以":"开头的路径）
  if (datapath[0] === ":") {
    //在param中查找参数值
    let key = datapath.substring(1);
    return nearest_param(container)[key];
  } else {
    // 在data中查找数据
    // 将路径分割成数组，支持 . 和 .. 等特殊路径
    let patharray = datapath.split("/");

    let data, datacontainer;
    // 判断container是否为DOM节点
    if (container.nodeName) {
      // 获取最近的数据容器元素
      datacontainer = nearest_datacontainer(container);
      if (!datacontainer) return undefined;
      data = datacontainer.thin_data;
    } else {
      // 如果不是DOM节点，直接使用container作为数据源
      data = container;
    }

    // 处理多层路径
    while (patharray.length > 1) {
      let path = patharray.shift();
      if (path === "..") {
        // 向上查找父级数据容器
        datacontainer = nearest_datacontainer(datacontainer.parentNode);
        if (!datacontainer) return undefined;
        data = datacontainer.thin_data;
      } else if (path === ".") {
        // 当前层级
        return data;
      } else {
        // 处理普通路径
        // 如果是写入模式且中间路径不存在，则创建空对象
        if (value !== undefined && data[path] === undefined) data[path] = {};
        // if (value !== undefined && typeof data[path] !== "object") {
        //   console.log("not object");
        //   console.log({ data, path, value });
        //   data[path] = {};
        // }
        data = data[path];
        if (data === undefined) return undefined;
      }
    }

    // 处理最后一层路径
    let path = patharray.shift();
    if (path === ".") {
      // 如果最后路径是"."，直接返回或设置当前数据
      if (value !== undefined) data = value;
      return data;
    } else {
      // 返回或设置指定路径的数据
      if (value !== undefined) {
        // console.log({ data, path, value });
        // if (typeof data !== "object") {
        //   console.log("not object");
        //   data = {};
        // }
        data[path] = value;
        // console.log({ data, path, value });
      }
      return data ? data[path] : undefined;
    }
  }
}
